perm filename GAR50.FAI[MUS,LCS]1 blob sn#007386 filedate 1974-01-08 generic text, type T, neo UTF8
	TITLE	Gardsk;  DOROTHY BENDER

; ******* GAR50 ********
;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;  
;  THE NAME OF THE FILE TO BE INPUTTED IS 'MUSIC',
;  THE FIRST RECORD OF WHICH CONTAINS THE
;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.

A   ←   1     ;WORK
B   ←   2     ;WORK
N←4
FB←5
TMP←7
SEC←6
RET ←   3     ;RETURN ACCUMULATOR
BUFSIZ ←=10*2000	;19 K PER BUFFER.
BANDSZ←=1280	;SECTORS PER BAND
↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT

OPDEF FBWRT [707B8]
OPDEF FBREAD [706B8]
	OPDEF	READCH [51B8]
        OPDEF   MESSAGE[51B8!3B12]

BEG:	CALLI	0,0         ;RESET I/O DEVICES
 	OPEN 	DSKCHN,[17  ;MODE
		'DSK   '    ;DEVICE NAME
 		0]          ;NO BUFFER HEADERS
	HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE

 	SETZM	FILBLK+3    ;FOR RESTART
LX:	MESSAGE [ASCIZ/
  TYPE `P' TO PLAY FROM DISK, `C' TO COPY TAPE TO DISK.
/]
	readch a
	cain a,"C"
	jrst start
	caie a,"P"
	jrst lx
	skipe filblk+3	;is this first time through ?
	jrst pla3	;No. Parameters already set up.
	;FIND OUT NUMBER OF CHANNELS AND
	;THE SPEED.

	MESSAGE	[ASCIZ/HOW MANY CHANNELS?/]
	READCH	A
	SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
	DPB	A,[POINT 2,OUTBIT,26]

	MESSAGE [ASCIZ/WHAT IS THE SPEED?/]
	READCH  A
	SUBI	A,"0"
	DPB	A,[POINT 3,OUTBIT,32]

PLA2:	SETZM FILBLK+3
	SETZM FILBL2+3
	LOOKUP	DSKCHN,FILBLK
	SKIPA
	JRST XOPEN
	LOOKUP DSKCHN, FILBL2

	JRST	[MESSAGE[ASCIZ/
		***FILE 'MUSIC' NOT FOUND/]
		CALLI  12]
        ;EXIT IF FILE IS MISSING

	MOVE A, FILBL2+3
	MOVEM A, FILBLK+3
XOPEN:	movs n,filblk+3		;get length of file.
	movnm n,nwd
	movei fb,0	;Start with logical band no. 0.
plx:	movei sec,0
	MOVE TMP,FB
	calli TMP,400010		;Get a fastband.
	halt
ply:	input dskchn,[iowd bufsiz,buf1
			0]
	movem sec,plzz
	fbwrt fb,[	buf1	;Write out a buffer on the fastband.
			bufsiz
		 plzz:	0]
	halt
	addi n,bufsiz
	jumpge n,pla3	;At end of input file ?
	addi sec,BUFSIZ/=32	;NO
	cail sec,BANDSZ	;End of band ?
	aoja fb,plx	;Yes.
	jrst ply
pla3:	close dskchn,0
	move n,nwd
	setzb fb,sec
	;BEGIN MAIN BODY OF PROGRAM
	OPEN	ADCHN,[117 	;MODE
         	'AD    '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS

  	JRST	[MESSAGE[ASCIZ/
		***D-A NOT AVAILABLE/]
		CALLI  12]
	;EXIT IF D-A IS UNAVAILABLE
SPWAR:	SPCWAR 17,[CALLI]
	MESSAGE [ASCIZ/ GO? /]
	READCH A

LOOP:	JSP	RET,subr		;RxoutINE TO READ AND WRITE
	BUF1-1 			;USE BUF1 FOR THE I/O
	JUMPLE	B,xout    	;DONE
	
	JSP	RET,subr		;CALL IT AGAIN
	BUF2-1			;USE BUF2 FOR THE I/O
	JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0

xout:	close dskchn,		;END OF PROGRAM.
	SPCWAR 0,'SSW'
	releas adchn,
	jrst lx

	;subrRxoutINE TO SET UP IOWD AND READ AND WRITE.
	;  1(RET) WILL BE THE RETURN
	;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
	;         PUT IN THE RIGHT HALF OF THE IOWD.
	;  A      WILL BE A WORK REGISTER
    	;  B      WILL BE TESTED ON THE xoutSIDE.

subr:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
	ADDB	A,N		;A←NWD-BUFSIZ
				;NWD←NWD-BUFSIZ
	MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
				;TIME.
	JUMPL	A,LAST		;SET UP FOR LAST TIME.
	MOVEI	A,0		

	;THE IOWD LOOKS LIKE:
	;  [-BUFSIZ / BUFI-1]

LAST:	ADDI	A,BUFSIZ
	MOVNS	A		;COMPLEMENT A
	HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
				;TO THE LEFT SIDE OF A.
	hlrzM	A,INLIST	;SWAP A AND MOVE IT.
	MOVSM	A,outWC		;SAME FOR xoutPUT.
	movem sec,inlist+2
	aos inlist		;Shit.
	fbread fb,inlist	;Read a buffer from fast dsk.
	halt
	OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
	addi sec,BUFSIZ/=32	;NO
	caiGE sec,BANDSZ	;End of band ?
	JRST	1(RET)		;RETURN
	movei sec,0
	aoja fb,1(ret)

;	-----------------------------------------

; STORAGE:

NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2

FILBLK: 'MUSIC '		;FILENAME FOR INPUT
	'MUS   '			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#

FILBL2:	'MUSAA '
	'DMD   '
	0
	0

CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0

INLIST:	0			;WILL CONTAIN AN IOWD
	bufsiz
	0

OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
	3650			;MAGIC BITS FOR 136.
OUTBIT: 4000			;BITS FOR D-A
	BLOCK	2
begin magdsk

A←1
B←2
D←3
OLNG←=4096	;size of mag tape records. must be multiple of =128.(USE 2342 FOR 360 TAPES)

ichn←adchn
ochn←dskchn
↑START:	CALLI 0
	INIT ICHN,3B28+17
	SIXBIT /MTA0/
	0
	HALT
	MTAPE ICHN,1	;REWIND THE TAPE
	JFCL
	INIT OCHN,17
	SIXBIT /DSK/
	0
	HALT
	ENTER OCHN,[SIXBIT /MUSIC/
                    SIXBIT /MUS/
	            0
	            0]
	HALT
	loop:input ichn,olst
		statz ichn,20000
		jrst xout	;end of tape.
		output ochn,olst
		jrst loop
OLST:	IOWD OLNG,OBUF
	0
obuf←← buf1
	bend magdsk

end beg